package com.mframe.persist;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.hibernate3.HibernateTemplate;

import com.mframe.query.PageData;
import com.mframe.query.SqlBuilder;
/**
 * @author cuijr
 * 数据库访问类接口
 * 2013年1月20日 16:03:05
 */
public interface PublicDAO {
	public HibernateTemplate getHibernateTemplate();
	public JdbcTemplate getJdbcTemplate();
	/**
	 * 持久化数据,保存
	 * @param <T>
	 * @param entity
	 */
	public <T> void save(T entity);
	/**
	 * 持久化数据,修改
	 * @param <T>
	 * @param entity
	 */
	public <T> void update(T entity);
	/**
	 * 持久化数据,保存或者修改(根据ID是否存在)
	 * remark:把get出来的对象设置一个要更改的值 然后update(这个对象)
	 * @param <T>
	 * @param entity
	 * @return
	 */
	public <T> T  saveOrUpdate(T entity);
	/**
	 * 修改数据(merge)
	 * @param entity
	 * @return
	 */
	public Object merge(Object entity);
	/**
	 * 修改数据
	 * remark:把get出来的对象设置一个要更改的值 然后update(这个对象)
	 * @param <T>
	 * @param entity
	 */
	public <T> void delete(T entity);
	/**
	 * 根据ID删数据
	 * @param <T>
	 * @param id
	 * @param clazz
	 */
	public <T> void deleteById(Serializable id ,Class<T> clazz);
	
	/**
	 * 执行修改的HQL语句
	 * @param hql
	 * @param args 传入多个参数(从0开始)
	 * @return
	 */
	public int executeHql(final String hql, final Object[] args);
	
	/**********************/
	/*******查询操作*******/
	/**
	 * 使用load方式获取对象
	 * remark:根据数据库的数据，转换成一个对象。当使用对象的时候才会查询、返回的是代理对象			
	 * @param <T>
	 * @param clazz
	 * @param id
	 * @return
	 */
	public <T> T loadById(Class<T> clazz,Serializable id);
	
	/**
	 * 使用get方式获取对象
	 * @param <T>
	 * @param clazz
	 * @param id
	 * @return
	 */
	public <T> T getById(Class<T> clazz,Serializable id);
	
	/**
	 * 根据HQL来查询对象
	 * @param <T>
	 * @param hql
	 * @param args 数组方式传入(从0开始)
	 * @return
	 */
	public <T> List<T> findByHql(String hql,Object[] args);
	
	/**
	 * @param <T>
	 * @param hql
	 * @param args Map键值对的方式传入 适用 : select obj where obj.a=:a 这种
	 * 		  key(a,使用另外的字串代表) value(实际的值)
	 * @return
	 */
	public <T> List<T> findByHql(String hql,Map<String,Object> args);
	
	/**
	 * @param hql 查询的HQL语句
	 * @param pmap 条件
	 * @param topage 当前页数
	 * @param pagesize 当前显示多少个数据
	 * @return
	 */
	public PageData findForPage(final String hql, Map<String,Object> pmap, int topage, int pagesize);
	
	/**
	 * 计算满足条件的记录数
	 * @param hql HQL语句(使用from obj的HQL 不使用count(*))
	 * @param args 参数(从0开始)
	 * @return
	 */
	public int findRecordCount(String hql, Object[] args);	
	
	/**
	 * 该条件下是否存在数据
	 * @param hql HQL语句
	 * @param args(从0开始)
	 * @return
	 */
	public boolean findExists(String hql,Object[] args);
	
	
	/********跟数据库有关*********/
	/*******存储过程*******/
	
	/**
	 * 调用存储过程返回游标数据
	 * @param storeName 存储过程
	 * @param paramValues 入参,参数顺序排好
	 * @return
	 */
	public List<Map<String,Object>> callForList(final String storeName,Object[] paramValues);
	
	/**
	 * 调用存储过程返回单指
	 * @param storeName 存储过程
	 * @param paramValues 
	 * @param sqlType 返回的out类型如:java.sql.Types.Varchar;
	 * 注意如果是数字类型，返回都是BigDecimal类型
	 * @return
	 */
	public Object callForObj(final String storeName,Object[] paramValues,int sqlType);
	
	/**
	 * 无返回值的存储过程
	 * @param storeName
	 * @param paramValues
	 */
	public void callForObj(final String storeName,Object[] paramValues);	

	/**
	 * 获取下个sequence的值
	 * @param seqName
	 * @return
	 */
	public Long getNextSequence(String seqName);
	
	/**
	 * function:JDBC执行sql语句
	 * remark:直接使用JDBC
	 * @param sql sql语句    
	 */			
	public void executeSql(String sql);
	
	/**
	 * function:取得MAP
	 * remark:直接使用JDBC
	 * @param sql sql语句
	 * @param args 参数列表    
	 */	
	public Map<String,Object> queryForMap(String sql, Object[] args);
	
	/**
	 * function:取得List
	 * remark:直接使用JDBC
	 * @param sql sql语句    
	 * @param args 参数列表    
	 */
	public <T> List<T> queryForBeanList(Class<T> clazz, String sql,Object[] args) ;
	
	/**
	 * 查询单个类对象
	 * @param <T>
	 * @param returnClazz 查询的类
	 * @param sql 查询语句
	 * @param paramsValues 查询参数
	 * @return
	 */
	public <T> T queryForBean(Class<T> returnClazz,String sql,Object[] paramsValues) ;
	
	/**
	 * jdbcTemplate 查询分页
	 * @param <T> 查询的类
	 * @param sql 查询的sql语句
	 * @param clazz 查询类的class（默认的rowMapper）
	 * @param topage 查询的页号
	 * @param pagesize 页大小
	 * @param paramsValues 查询参数，常用？ 占位符形式
	 * @return
	 */
	public <T> PageData queryForPageData(String sql,Class<T> clazz,final int topage, final int pagesize,Object[] paramsValues);
	public Object queryForObject(String sql,Object[] paramsValues);
	public Integer queryForInt(String sql,Object[] paramsValues);
	public Long queryForLong(String sql,Object[] paramsValues);
	public <T> List<T> queryForList(String sql, Object[] args,Class<T> elementType);
	
	/**
	 * 根据SqlBuilder对象查询
	 * @param builder
	 * @return PageData/List 如果SqlBuilder的listType是Page则返回PageData，否则返回List对象
	 */
	public Object queryBySqlBuilder(SqlBuilder builder);
	public Object queryUnique(SqlBuilder builder);
}
